#ifndef _RAWCOLOR6232011_H_
#define _RAWCOLOR6232011_H_

enum BlendType {
	ONE_MINUS_ALPHA
};

template <class T, 
	class lowerbond,
	class upperbond,
	class defaultvalue
>
struct RawColor4
{
	static const int DEMENSION = 4;
	typedef T Type;

	union {
		struct { Type r, g, b, a };
		Type data[DEMENSION];
	};

	RawColor4():
	r(defaultvalue), g(defaultvalue), b(defaultvalue), a(defaultvalue){};
	RawColor4(Type _r, Type _g, Type _b, Type _a = defaultvalue):
	r(_r), g(_g), b(_b), a(_a) {};

	RawColor4 blend(const RawColor4& p, BlendType f) {
		return RawColor4();
	}

protected:
	inline void adjust() {
		for (int i = 0; i < DEMENSION; i ++) {
			adjustelement(data[i]);
		}
	}
	inline Type factor() const{ return 1; }

private:
	inline void adjustelement(Type& x) {
		if (x > upperbond) x =upperbond;
		else if (x < lowerbond) x = lowerbond;
	}
};


// struct RawColor4f
// {
// 	static const int DEMENSION = 4;
// 	typedef float Type;
// 
// 	union {
// 		struct { Type r, g, b, a };
// 		Type data[DEMENSION];
// 	};
// 
// 	RawColor4f():
// 	r(1.0f), g(1.0f), b(1.0f), a(1.0f){};
// 	RawColor4f(Type _r, Type _g, Type _b, Type _a = 1.0f):
// 	r(_r), g(_g), b(_b), a(_a) {};
// 
// 	RawColor4f blend(const RawColor4f& p, BlendType f) {
// 		return RawColor4f();
// 	}
// 
// protected:
// 	inline void adjust() {
// 		adjustelement(r);
// 		adjustelement(g);
// 		adjustelement(b);
// 		adjustelement(a);
// 	}
// 	inline Type factor() const{ return 1.0f; }
// 
// private:
// 	inline void adjustelement(Type& x) {
// 		if (x > 1.0f) x = 1.0f;
// 		else if (x < 0.0f) x = 0.0f;
// 	}
// };
// 
// struct RawColor4i
// {
// public:
// 	static const int DEMENSION = 4;
// 	typedef int Type;
// 
// 	union {
// 		struct { Type r, g, b, a };
// 		Type data[DEMENSION];
// 	};
// 
// 	RawColor4i():
// 	r(255), g(255), b(255), a(255) {}
// 
// 	RawColor4i(Type _r, Type _g, Type _b, Type _a = 255):
// 	r(_r), g(_g), b(_b), a(_a) {}
// 
// 	RawColor4f blend(const RawColor4f& p, BlendType f) {
// 		return RawColor4f();
// 	}
// protected:
// 	inline void adjust() {
// 		adjustelement(r);
// 		adjustelement(g);
// 		adjustelement(b);
// 		adjustelement(a);
// 	}
// 	inline Type factor() const{ return 1; }
// private:
// 	inline void adjustelement(Type& x) {
// 		if (x > 255) x = 255;
// 		else if (x < 0) x = 0;
// 	}
// };
#endif // _RAWCOLOR6232011_H_